<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:18px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="question-header"></a><a href="https://stackoverflow.com/questions/63250671/how-to-delete-all-rows-in-a-table-using-office-scripts"><span style=" font-size:xx-large; font-weight:600; text-decoration: underline; color:#0000ff;">К</span></a><span style=" font-size:xx-large; font-weight:600; text-decoration: underline; color:#0000ff;">ак удалить все строки в таблице с помощью сценариев Office</span></p>
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">У меня есть таблица в электронной таблице, и я хочу удалить все существующие данные. Я использую приведенный ниже код, который работает, за исключением случаев, когда таблица уже пуста.</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas'; background-color:#eff0f1;">// Get the row count</span></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas'; background-color:#eff0f1;">let rowCount = table.getRangeBetweenHeaderAndTotal().getRowCount();</span></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas'; background-color:#eff0f1;">// Delete all the rows</span></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas'; background-color:#eff0f1;">table.deleteRowsAt(0,rowCount);</span></p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><br /></p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10px;"><br /></p>
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Проблема в том, что rowCount вернет 1, даже если таблица пуста. При <span style=" font-family:'Courier New';">deleteRowsAt</span>попытке удалить строку в пустой таблице возвращается ошибка.</p>
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">В VBA мы можем использовать <span style=" font-family:'Courier New';">table.ListRows.Count</span>и это вернет 0, если таблица пуста.</p>
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Пример: у меня есть 3 строки в таблице. </p>
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Если я выберу все строки и удалю их из таблицы, я получу следующее: </p>
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">В этой таблице теперь нет строк, но у меня нет возможности получить этот результат. Как я уже сказал, в VBA мы будем использовать <span style=" font-family:'Courier New';">table.ListRows.Count</span>, и это вернет 0, но я не могу найти эквивалент для сценариев Office.</p>
<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style="" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="https://stackoverflow.com/questions/tagged/office-scripts"><span style=" text-decoration: underline; color:#0000ff;">офисные скрипты</span></a></li></ul>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="https://stackoverflow.com/q/63250671"><span style=" text-decoration: underline; color:#0000ff;">Делиться</span></a></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="btnFollowPost-63250671"></a>Следовать</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">спросил 4 авг. 2020 г., 15:58</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="https://stackoverflow.com/users/4474195/paul-kelly"><span style=" text-decoration: underline; color:#0000ff;">Пол Келли</span></a></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">97511 золотой значок77 серебряных значков1313 бронзовых знаков</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="comments-link-63250671"></a><a href="https://stackoverflow.com/questions/63250671/how-to-delete-all-rows-in-a-table-using-office-scripts#"><span style=" text-decoration: underline; color:#0000ff;">Д</span></a><span style=" text-decoration: underline; color:#0000ff;">обавить комментарий</span></p>
<p style=" margin-top:16px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="answers"></a><span style=" font-size:x-large; font-weight:600;">3</span><span style=" font-size:x-large; font-weight:600;"> ответа</span></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Отсортировано по:</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="answer-sort-dropdown-select-menu"></a>                                              Наивысший балл (по умолчанию)                                                                   В тренде (недавние голоса имеют большее значение)                                                                   Дата изменения (сначала самые новые)                                                                   Дата создания (сначала самое старое)                              </p>
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Не нашли ответ? <a href="https://ru.stackoverflow.com/questions/ask?utm=soenseru&amp;fromen=3c520ef0460db"><span style=" text-decoration: underline; color:#0000ff;">Задайте вопрос о переполнении стека на английском языке.</span></a></p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="answer-63252171"></a>5</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p>
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ОБНОВЛЯТЬ:</p>
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Теперь <span style=" font-family:'Courier New';">getRowCount</span>у нас есть API, который вы можете использовать для решения этого сценария. Он вернет фактические строки (не считая заголовка или строки расширения).</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas'; background-color:#eff0f1;">    </span><span style=" font-family:'Consolas';">// Assuming there's a table in the workbook named Table1</span></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas'; background-color:#eff0f1;">    </span><span style=" font-family:'Consolas';">let rowCount = workbook.getTable('Table1').getRowCount(); // Table1</span></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas'; background-color:#eff0f1;">    </span><span style=" font-family:'Consolas';">// Assuming there's a table in the workbook</span></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas'; background-color:#eff0f1;">    </span><span style=" font-family:'Consolas';">let rowCount = workbook.getTables()[0].getRowCount(); // First table</span></p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><br /></p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10px;"><br /></p>
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">====</p>
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">СТАРЫЙ ОТВЕТ</p>
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Я думаю, что нам не хватает API, который будет обеспечивать подсчет строк. Мы добавим это в резерв. Обходной путь:</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas';">function main(workbook: ExcelScript.Workbook) {</span></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas'; background-color:#eff0f1;">  </span><span style=" font-family:'Consolas';">let table = workbook.getTable(&quot;Table26&quot;);</span></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas'; background-color:#eff0f1;">  </span><span style=" font-family:'Consolas';">let rowCount = table.getRangeBetweenHeaderAndTotal().getRowCount();</span></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas'; background-color:#eff0f1;">  </span><span style=" font-family:'Consolas';">try { </span></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas'; background-color:#eff0f1;">    table.</span><span style=" font-family:'Consolas';">deleteRowsAt(0, rowCount);</span></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas'; background-color:#eff0f1;">  } </span><span style=" font-family:'Consolas';">catch (e) {</span></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas'; background-color:#eff0f1;">    </span><span style=" font-family:'Consolas';">if (rowCount === 1 &amp;&amp; e.code === 'InvalidArgument') {</span></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas'; background-color:#eff0f1;">       </span><span style=" font-family:'Consolas';">console.log(&quot;This error means there's no row to delete.&quot;)</span></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas'; background-color:#eff0f1;">    }</span></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas'; background-color:#eff0f1;">  }</span></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas'; background-color:#eff0f1;">}</span></p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><br /></p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10px;"><br /></p>
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Если количество строк равно 1, а код ошибки — конкретный, который возвращается при удалении «вставки-строки», то мы можем игнорировать ошибку. Опять же, лучшим подходом было бы использовать API для объекта таблицы, чтобы получить количество строк и удалять строки только тогда, когда количество строк &gt;= 1. Мы продолжим исследование, чтобы улучшить взаимодействие.</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="answer-64128811"></a><span style=" font-weight:600; color:#00aa00;">'==============================================================================</span></p>
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Я провел несколько быстрых тестов, удалив 5000 строк (5 столбцов, разные типы данных), <span style=" font-family:'Courier New';">deleteRowsAt()</span>и это постоянно занимало от 20 до 30 секунд. Но ~10 000 строк или больше, и каждый раз у меня возникал тайм-аут, скрипт никогда не завершался. Вызов сценария из Flow также привел к тайм-ауту шлюза с несколькими повторными попытками перед сбоем.</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas'; background-color:#eff0f1;">table.deleteRowsAt(0, rowCount);</span></p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><br /></p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10px;"><br /></p>
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Но использование <span style=" font-family:'Courier New';">getRangeBetweenHeaderAndTotal()</span>ссылки на диапазон для удаления сработало хорошо: 200 000 строк одних и тех же тестовых данных примерно за 2 секунды. В документации упоминается, что диапазоны быстрее, они определенно присутствуют в моих тестах.</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#eff0f1;"><span style=" font-family:'Consolas'; font-weight:600; color:#00aa00; background-color:#eff0f1;">table.getRangeBetweenHeaderAndTotal().delete(0);</span></p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10px;"><br /></p></body></html>